package com.liufei.class03;

public class Code02_EvenTimesOddTimes {


    // arr 只有一种数出现奇数次，找出这个数并返回
    public static int printOddTimesNum1(int[] arr) {
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        return eor;
    }

    // arr 有两种数出现奇数次，找出这个数并返回
    public static void printOddTimesNum2(int[] arr) {
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        // a 和 b是两种数
        // eor != 0
        // eor 最右侧的1，提取出来
        // eor :     00110010110111000
        // rightOne :00000000000001000
        // 找到最后一位是1的数
        int rightOne = eor & (-eor);
        int eor2 = 0;
        for (int i = 0; i < arr.length; i++) {
            // 说明 arr[i] 和 onlyOne一样，那个位置上都是1
            if ((arr[i] & rightOne) != 0) {
                eor2 ^= arr[i];
            }
        }
        System.out.println(eor2 + "--" + (eor ^ eor2));
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 2, 2, 3, 3, 1, 3, 1, 2, 1, 5};
        int res = printOddTimesNum1(arr);
        System.out.println(res);

        int[] arr2 = {1, 2, 3, 2, 2, 3, 3, 1, 3, 1, 2, 5};
        printOddTimesNum2(arr2);
    }
}
